/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Persistencia;

import Negocio.Bicicleta;
import Negocio.Comentario;
import Negocio.Usuario;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;


/**
 *
 * @author JAVA
 */
public class PUsuario {
    
    public static void crearUsuarioBD(Usuario u) {
        
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
        
        DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
        
        try {
            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection(PDatos.baseDatos, PDatos.usuario, PDatos.password);
            statement = connection.createStatement();

            //Ciertos campos requieren tratamiento previo para pasarlo a String

            Date dateNacimiento = u.getFechaNacimiento();
            String stringNacimiento = dateFormat.format(dateNacimiento);
            
            Date dateFechaAlta = u.getFechaAlta();
            String stringFechaAlta = dateFormat.format(dateFechaAlta);
            
            u.setRutaFoto("usuario_default.png");

            //Pasamos el INSERT a la base de datos
            
            String SQL = "INSERT INTO usuario (nombre, apellidos, email, "
                    + "pass, fecha_nacimiento, sexo, ciudad, rutaFoto, fecha_alta, activo,estado) values ('"
                    + u.getNombre() + "', '" + u.getApellidos() + "', '"
                    + u.getEmail() + "', '" + u.getPassword() + "', '"
                    + stringNacimiento + "', '" + u.getSexo() + "', '"
                    + u.getCiudad() + "', '" + u.getRutaFoto() + "', '"
                    + stringFechaAlta +"' , 1, '" + u.getEstado() + "' )";

            statement.executeUpdate(SQL);

            //Asignamos el ID con el que se guardó en la base de datos

            resultSet = statement.executeQuery("SELECT ID FROM usuario ORDER BY ID DESC");
            if (resultSet.next()) {
                u.setId(resultSet.getInt("id"));
            }
            
            
        } catch (Exception ex) {
            System.out.println(ex.toString());
        } finally {
            try {
                resultSet.close();
                statement.close();
                connection.close();
            } catch (Exception ex) {
                System.out.println(ex.toString());
            }
        }
    }
    
    public static void actualizarUsuarioBD(Usuario u) {
        
        Connection connection = null;
        Statement statement = null;
        DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
        
        try {
            
            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection(PDatos.baseDatos, PDatos.usuario, PDatos.password);
            statement = connection.createStatement();

            //Ciertos campos requieren tratamiento previo para pasarlo a String

            Date dateNacimiento = u.getFechaNacimiento();
            String stringNacimiento = dateFormat.format(dateNacimiento);
            
            int activo = u.isActivo() ? 1 : 0;

            //Pasamos el UPDATE a la base de datos
            
            String SQL = "UPDATE usuario "
                    + "SET nombre = '" + u.getNombre()
                    + "', apellidos = '" + u.getApellidos()
                    + "', email = '" + u.getEmail()
                    + "', pass = '" + u.getPassword()
                    + "', fecha_nacimiento = '" + stringNacimiento
                    + "', sexo = '" + u.getSexo()
                    + "', ciudad = '" + u.getCiudad()
                    + "', rutaFoto = '" + u.getRutaFoto()
                    + "', activo = " + activo
                    + ", estado = '" + u.getEstado()
                    + "' WHERE ID = "+u.getId();

            statement.executeUpdate(SQL);
            
            
        } catch (Exception ex) {
            System.out.println(ex.toString());
        } finally {
            try {
                statement.close();
                connection.close();
            } catch (Exception ex) {
                System.out.println(ex.toString());
            }
        }
    }
   
    public static void eliminarUsuarioBD(Usuario u) {
        
        Connection connection = null;
        Statement statement = null;
        
        try {
            
            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection(PDatos.baseDatos, PDatos.usuario, PDatos.password);
            statement = connection.createStatement();

            statement.executeUpdate("DELETE FROM usuario WHERE ID = " + u.getId());
            
        } catch (Exception ex) {
            System.out.println(ex.toString());
        } finally {
            try {
                statement.close();
                connection.close();
            } catch (Exception ex) {
                System.out.println(ex.toString());
            }
        }
    }
    
    public static List<Usuario> devolverListaAmigosBD(Usuario u) {
        
        List<Usuario> listAmigos = new ArrayList();
        
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
        
        try {
            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection(PDatos.baseDatos, PDatos.usuario, PDatos.password);
            statement = connection.createStatement();
            
            resultSet = statement.executeQuery("SELECT id, id_usuario, id_amigos from usuarioamigo where id_usuario=" + u.getId());
            
            while (resultSet.next()) {
                int id_amigo = resultSet.getInt("id_amigos");
                Usuario amigo = seleccionarUsuarioLiteBD(id_amigo);
                if(amigo.isActivo()){
                    listAmigos.add(amigo);
                }                
            }            
            
        } catch (Exception ex) {
            System.out.println(ex.toString());
        } finally {
            try {
                resultSet.close();
                statement.close();
                connection.close();
            } catch (Exception ex) {
                System.out.println(ex.toString());
            }
        }
        return listAmigos;
    }
   
    public static List<Usuario> devolverListaSeguidoresBD(Usuario u) {
        
        List<Usuario> listSeguidores = new ArrayList();
        
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
        
        try {
            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection(PDatos.baseDatos, PDatos.usuario, PDatos.password);
            statement = connection.createStatement();
            
            resultSet = statement.executeQuery("SELECT id, id_usuario, id_amigos from usuarioamigo where id_amigos=" + u.getId());
            
            while (resultSet.next()) {
                int id_usuario = resultSet.getInt("id_usuario");
                Usuario amigo = seleccionarUsuarioLiteBD(id_usuario);
                if(amigo.isActivo()){
                    listSeguidores.add(amigo);
                }                
            }            
            
        } catch (Exception ex) {
            System.out.println(ex.toString());
        } finally {
            try {
                resultSet.close();
                statement.close();
                connection.close();
            } catch (Exception ex) {
                System.out.println(ex.toString());
            }
        }
        return listSeguidores;
    }
    public static Usuario seleccionarUsuarioBD(int id) {
        
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
        Usuario usuario = new Usuario();
        
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        
        try {
            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection(PDatos.baseDatos, PDatos.usuario, PDatos.password);
            statement = connection.createStatement();
            
            String SQL = "SELECT id, nombre, apellidos, email,pass, fecha_nacimiento, "
                    + "sexo, ciudad, rutaFoto, fecha_alta, activo, estado FROM usuario where id=" + id;
            
            resultSet = statement.executeQuery(SQL);
            
            if (resultSet.next()) {                
                
                int activo = resultSet.getInt("activo");
                
                if (activo == 1){
                    usuario.setActivo(true);
                }else {
                    usuario.setActivo(false);
                }
                
                usuario.setId(resultSet.getInt("id"));
                usuario.setApellidos(resultSet.getString("apellidos"));
                usuario.setNombre(resultSet.getString("nombre"));
                usuario.setPassword(resultSet.getString("pass"));
                usuario.setEmail(resultSet.getString("email"));
                usuario.setFechaNacimiento(dateFormat.parse(resultSet.getString("fecha_nacimiento")));
                usuario.setSexo(resultSet.getString("sexo"));
                usuario.setCiudad(resultSet.getString("ciudad"));
                usuario.setRutaFoto(resultSet.getString("rutaFoto"));
                usuario.setFechaAlta(dateFormat.parse(resultSet.getString("fecha_alta"))); 
                usuario.setEstado(resultSet.getString("estado"));
                List<Usuario> listAmigos = devolverListaAmigosBD(usuario);
                usuario.setListAmigos(listAmigos);
                List<Usuario> listSeguidores = devolverListaSeguidoresBD(usuario);
                usuario.setListSeguidores(listSeguidores);
                List<Bicicleta> listBicicletas = Bicicleta.devolverListaBicicletas(usuario);
                usuario.setListBicicleta(listBicicletas);
                List<Comentario> listaComentarios = Comentario.devolverListaMensajes(usuario);
                usuario.setListComentarios(listaComentarios);
            }
            
            
        } catch (Exception ex) {
            System.out.println(ex.toString());
        } finally {
            try {
                resultSet.close();
                statement.close();
                connection.close();
            } catch (Exception ex) {
                System.out.println(ex.toString());
            }
        }
        return usuario;
    }
    
    public static Usuario seleccionarUsuarioAmigoBD(int id) {
        
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
        Usuario usuario = new Usuario();
        
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        
        try {
            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection(PDatos.baseDatos, PDatos.usuario, PDatos.password);
            statement = connection.createStatement();
            
            String SQL = "SELECT nombre, apellidos, email,fecha_nacimiento, "
                    + "sexo, ciudad, rutaFoto, fecha_alta, FROM usuario where id=" + id;
            
            resultSet = statement.executeQuery(SQL);
            
            if (resultSet.next()) {                
                
                
                usuario.setApellidos(resultSet.getString("apellidos"));
                usuario.setNombre(resultSet.getString("nombre"));
                usuario.setEmail(resultSet.getString("email"));
                usuario.setFechaNacimiento(dateFormat.parse(resultSet.getString("fecha_nacimiento")));
                usuario.setSexo(resultSet.getString("sexo"));
                usuario.setCiudad(resultSet.getString("ciudad"));
                usuario.setRutaFoto(resultSet.getString("rutaFoto"));
                usuario.setFechaAlta(dateFormat.parse(resultSet.getString("fecha_alta"))); 
                List<Bicicleta> listBicicletas = Bicicleta.devolverListaBicicletas(usuario);
                usuario.setListBicicleta(listBicicletas);
            }
        } catch (Exception ex) {
            System.out.println(ex.toString());
        } finally {
            try {
                resultSet.close();
                statement.close();
                connection.close();
            } catch (Exception ex) {
                System.out.println(ex.toString());
            }
        }
        return usuario;
    }
    
    public static Usuario seleccionarUsuarioLiteBD(int id) {
        
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
        Usuario usuario = new Usuario();
        
        try {
            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection(PDatos.baseDatos, PDatos.usuario, PDatos.password);
            statement = connection.createStatement();
            
            resultSet = statement.executeQuery("SELECT id, nombre, apellidos, rutaFoto, activo FROM usuario where id=" + id);
            
            if (resultSet.next()) {                
                usuario.setId(resultSet.getInt("id"));
                usuario.setApellidos(resultSet.getString("apellidos"));
                usuario.setNombre(resultSet.getString("nombre"));
                usuario.setRutaFoto(resultSet.getString("rutaFoto"));
                
                int activo = resultSet.getInt("activo");
                if (activo ==1){
                    usuario.setActivo(true);
                }else {
                    usuario.setActivo(false);
                }
                
            }
        } catch (Exception ex) {
            System.out.println(ex.toString());
        } finally {
            try {
                resultSet.close();
                statement.close();
                connection.close();
            } catch (Exception ex) {
                System.out.println(ex.toString());
            }
        }
        return usuario;
    }
    
    public static int comprobarUsuarioBD (String login, String pass){
        
        int iddevuelto=-1;        
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
        
        try {
            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection(PDatos.baseDatos, PDatos.usuario, PDatos.password);
            statement = connection.createStatement();
            
            String SQL = "SELECT id, email, pass FROM usuario where email = '" + login + "'";
            
            resultSet = statement.executeQuery(SQL);
            
            if (resultSet.next()) {                
                String loginU = resultSet.getString("email");
                String passU = resultSet.getString("pass");                
                if (loginU.equals(login) && pass.equals(passU)){
                    iddevuelto = resultSet.getInt("id");
                }
            }
        } catch (Exception ex) {
            System.out.println(ex.toString());
        } finally {
            try {
                resultSet.close();
                statement.close();
                connection.close();
            } catch (Exception ex) {
                System.out.println(ex.toString());
            }
        }
        return iddevuelto;
    }
    
    public static List<Usuario> devolverListaUsuariosBD(String nomape) {
        
        List<Usuario> listUsuarios = new ArrayList();
        
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
        
        try {
            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection(PDatos.baseDatos, PDatos.usuario, PDatos.password);
            statement = connection.createStatement();
            
            resultSet = statement.executeQuery("SELECT id, CONCAT(nombre,  ' ', apellidos) as nom FROM usuario WHERE CONCAT(nombre,  ' ', apellidos) like '%"+nomape+"%' AND activo=1");
            
            while (resultSet.next()) {
                int id = resultSet.getInt("id");
                Usuario usuario = seleccionarUsuarioLiteBD(id);
                listUsuarios.add(usuario);
            }
            
            
        } catch (Exception ex) {
            System.out.println(ex.toString());
        } finally {
            try {
                resultSet.close();
                statement.close();
                connection.close();
            } catch (Exception ex) {
                System.out.println(ex.toString());
            }
        }
        return listUsuarios;
    }
    
    public static void eliminarAmigoBD(Usuario u, Usuario a) {
        
        Connection connection = null;
        Statement statement = null;
        
        try {
            
            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection(PDatos.baseDatos, PDatos.usuario, PDatos.password);
            statement = connection.createStatement();

            String SQL = "DELETE FROM usuarioamigo WHERE id_usuario = "+u.getId()+" and id_amigos = " + a.getId();
            statement.executeUpdate(SQL);
            
        } catch (Exception ex) {
            System.out.println(ex.toString());
        } finally {
            try {
                statement.close();
                connection.close();
            } catch (Exception ex) {
                System.out.println(ex.toString());
            }
        }
    }
    
    public static void anadirAmigoBD(Usuario u, Usuario a) {
        
        Connection connection = null;
        Statement statement = null;
        
        try {
            
            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection(PDatos.baseDatos, PDatos.usuario, PDatos.password);
            statement = connection.createStatement();

            String SQL = "INSERT INTO usuarioamigo (id_usuario, id_amigos) values "
                    + "(" + u.getId() + ", " + a.getId() + ")";

            statement.executeUpdate(SQL);
            
        } catch (Exception ex) {
            System.out.println(ex.toString());
        } finally {
            try {
                statement.close();
                connection.close();
            } catch (Exception ex) {
                System.out.println(ex.toString());
            }
        }
    }
    
    
    
}
